package gui;

import java.util.*;
import java.awt.Font;
import java.awt.FontMetrics;
import javax.swing.text.TabSet;
import javax.swing.text.TabStop;
import highlight.CodeDocument;

/**
 * Zone de texte avec coloration
 * 
 * @author			Christos Kornaros, Grégory Moinat, Nicolas Muller
 * @version			1.0, 09.04.2008
 * Fichier :		JColoredTextZone.java
 * Remarque(s) :	-
 * Compilateur : 	jdk1.6.0_02
*/ 
public class JColoredTextZone extends javax.swing.JTextPane{
	
	private static final long serialVersionUID = 1L;
	 
	 private int nbTab = 3;
	
	
	/**
	 * Constructeur de la classe
	 */
	public JColoredTextZone(){

		//Document coloré
		CodeDocument doc = new CodeDocument();
		
		Vector<String> keywords = new Vector<String>();
	    keywords.addElement("abstract");
	    keywords.addElement("boolean");
	    keywords.addElement("break");
	    keywords.addElement("byte");
	    keywords.addElement("byvalue");
	    keywords.addElement("case");
	    keywords.addElement("cast");
	    keywords.addElement("catch");
	    keywords.addElement("char");
	    keywords.addElement("class");
	    keywords.addElement("const");
	    keywords.addElement("continue");
	    keywords.addElement("default");
	    keywords.addElement("do");
	    keywords.addElement("double");
	    keywords.addElement("extends");
	    keywords.addElement("else");
	    keywords.addElement("false");
	    keywords.addElement("final");
	    keywords.addElement("finally");
	    keywords.addElement("float");
	    keywords.addElement("for");
	    keywords.addElement("future");
	    keywords.addElement("generic");
	    keywords.addElement("if");
	    keywords.addElement("implements");
	    keywords.addElement("import");
	    keywords.addElement("inner");
	    keywords.addElement("instanceof");
	    keywords.addElement("int");
	    keywords.addElement("interface");
	    keywords.addElement("long");
	    keywords.addElement("native");
	    keywords.addElement("new");
	    keywords.addElement("null");
	    keywords.addElement("operator");
	    keywords.addElement("outer");
	    keywords.addElement("package");
	    keywords.addElement("private");
	    keywords.addElement("protected");
	    keywords.addElement("public");
	    keywords.addElement("rest");
	    keywords.addElement("return");
	    keywords.addElement("short");
	    keywords.addElement("static");
	    keywords.addElement("super");
	    keywords.addElement("switch");
	    keywords.addElement("synchronized");
	    keywords.addElement("this");
	    keywords.addElement("throw");
	    keywords.addElement("throws");
	    keywords.addElement("transient");
	    keywords.addElement("true");
	    keywords.addElement("try");
	    keywords.addElement("var");	
	    keywords.addElement("void");
	    keywords.addElement("volatile");
	    keywords.addElement("while");
	    keywords.addElement("using");
	    keywords.addElement("namespace");
	    
	    doc.setKeywords(keywords);
	    this.setDocument(doc);
	    this.setFont( new Font("monospaced", Font.PLAIN, 12) );
	    this.setNbTabs(nbTab);
	     	
	}
	
    
	/**
	 * Modificateur pour la taille (nombre d'espace) des tabulations
	 * 
	 * @param tabSize taille (nombre d'espaces) des tabulations
	 */
	public void setNbTabs(int tabSize)
	{
		// w est un caractère de référence car il prend de la place à l'affichage
		final char refChar = 'w';
		final int  nbTabMax = 100;
		int tabWidth;
		FontMetrics fontMetrics;
		TabSet tabSet;
		
		fontMetrics = getFontMetrics(getFont());
		tabWidth = fontMetrics.charWidth(refChar) * tabSize; 
		TabStop[] tabs = new TabStop[nbTabMax];
 
		for (int i=0; i<tabs.length; i++){
			int tab = i + 1;
			tabs[i] = new TabStop(tab * tabWidth);
		}
 
		tabSet = new TabSet(tabs);
		getCodeDocument().setTabSet(tabSet);
		getCodeDocument().setTabSize(tabSize);
	}
	
	/**
	 * @return Retourne la taille (nombre d'espaces) des tabulations
	 */
	public int getNbTab() {
		return nbTab;
	}
	
	/**
	 * Sélecteur du document utilisé
	 * 
	 * @return document utilisé
	 */
	public CodeDocument getCodeDocument () {
		return (CodeDocument)getDocument();
	}
}	